package com.by.aop;

import java.lang.annotation.*;

/**
 * 自定义注解
 * @Documented 一个简单的Annotations标记注解，表示是否将注解信息添加在java文档中
 *
 * @Retention() 什么时候使用该注解
 *  定义注解的生命周期
 *  1)RetentionPolicy.SOURCE : 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义，所以它们不会写入字节码。
 *  2)RetentionPolicy.CLASS : 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式
 *  3)RetentionPolicy.RUNTIME : 始终不会丢弃，运行期也保留该注解，因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
 *
 * @Target() 注解用于什么地方
 *  表示该注解用于什么地方。默认值为任何元素，表示该注解用于什么地方。
 *  1)ElementType.CONSTRUCTOR:用于描述构造器
 *  2)ElementType.FIELD:成员变量、对象、属性（包括enum实例）
 *  3)ElementType.LOCAL_VARIABLE:用于描述局部变量
 *  4)ElementType.METHOD:用于描述方法
 *  5)ElementType.PACKAGE:用于描述包
 *  6)ElementType.PARAMETER:用于描述参数
 *  7)ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
 *
 * @Inherited 是否允许子类集成该注解
 *  如果一个使用了@Inherited修饰的annotation类型被用于一个class，则这个annotation将被用于该class的子类
 */
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Operation {
	String value() default "";
}
